package 作用域相关;


import 抽象语法树节点.抽象语法树;

// 程序中实体的名称，如变量名、方法名、类名等
public abstract class 符号 {
    public 符号(String 名称) {
        this(名称, null);
    }

    public 符号(String 名称, 类型 类型) {
        this.名称 = 名称;
        this.类型 = 类型;
    }

    public String 名称;
    public 类型 类型;
    public 作用域 所在作用域;      // 所有符号都知道它们包含在哪个作用域中

    public 抽象语法树 节点;

    public String 取名称() {
        return 名称;
    }

    @Override
    public String toString() {
        var 结果 = "";
        if (所在作用域 != null) {
            结果 = 所在作用域.取作用域名() + ".";
        }

        if (类型 != null) {
            return '<' + 结果 + 取名称() + ":" + 类型 + '>';
        }

        return 结果 + 取名称();
    }

    public static String 去除括号(String s) {
        return s.substring(1, s.length() - 1);
    }
}
